home *** CD-ROM | disk | FTP | other *** search
/ Aminet 16 / Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso / Aminet / dev / src / wangisrc.lha / wangi / z / SlowBoot / SlowBoot.c < prev    next >
C/C++ Source or Header  |  1996-02-04  |  4KB  |  192 lines

  1. /*************************************************************************
  2.  *
  3.  * SlowBoot
  4.  *
  5.  * Copyright ©1995-96 Lee Kindness cs2lk@scms.rgu.ac.uk
  6.  *
  7.  * Read SlowBoot.guide (from the main archive) for distribution details.
  8.  *
  9.  * SlowBoot.c
  10.  */
  11.  
  12. #include "gst.c"
  13. #include "SlowBoot_rev.h"
  14.  
  15. const STRPTR vtag = VERSTAG;
  16. STRPTR defcmd = "Execute <>CON:///-1/AmigaDOS/AUTO/NOCLOSE/SMART s:startup-sequence";
  17.  
  18. void NewAssign(STRPTR name, STRPTR to, BPTR def);
  19. void NewAssignLate(STRPTR name, STRPTR to, BPTR def);
  20.  
  21.  
  22. /*************************************************************************
  23.  * NewAssign() -- Reassign an assign
  24.  */
  25.  
  26. void NewAssign(STRPTR name, STRPTR to, BPTR def)
  27. {
  28.     /* Remove old assign */
  29.     if( AssignLock(name, NULL) )
  30.     {
  31.         BPTR lock;
  32.         
  33.         /* Lock new destination */
  34.         if( lock = Lock(to, ACCESS_READ) )
  35.         {
  36.             /* Add Assign */
  37.             if( !AssignLock(name, lock) )
  38.                 UnLock(lock);
  39.         } else
  40.         {
  41.             /* Assign to default location */
  42.             lock = DupLock(def);
  43.             if( !AssignLock(name, lock) )
  44.                 UnLock(lock);
  45.         }
  46.     }
  47. }
  48.  
  49.  
  50. /*************************************************************************
  51.  * NewAssignLate() -- Reassign a late (defered) assign
  52.  */
  53.  
  54. void NewAssignLate(STRPTR name, STRPTR to, BPTR def)
  55. {
  56.     /* Remove old assign */
  57.     if( AssignLock(name, NULL) )
  58.     {
  59.         /* Add Assign */
  60.         if( !AssignLate(name, to) )
  61.         {
  62.             BPTR lock;
  63.             /* Assign to default location */
  64.             lock = DupLock(def);
  65.             if( !AssignLock(name, lock) )
  66.                 UnLock(lock);
  67.         }
  68.     }
  69. }
  70.  
  71.  
  72. /*************************************************************************
  73.  * main()
  74.  */
  75.  
  76. #define OPT_DEVICE 0
  77. #define OPT_WAIT 1
  78. #define OPT_NOREASSIGN 2
  79. #define OPT_CMD 3
  80. #define OPT_MAX 4
  81. #define TEMPLATE "DEVICE/A,WAIT/N/K,NOREASSIGN/S,CMD=COMMAND/K"
  82.  
  83. void main( void )
  84. {
  85.     struct Process *myproc;
  86.     
  87.     /* Check Library versions */
  88.     if( (((struct Library *)SysBase)->lib_Version < 36) ||
  89.         (((struct Library *)DOSBase)->lib_Version < 36) )
  90.         return;
  91.     
  92.     /* Find our process */
  93.     if( myproc = (struct Process *)FindTask(NULL) )
  94.     {
  95.         APTR oldwinp;
  96.         struct RDArgs *rdargs;
  97.         LONG args[OPT_MAX] = {0, 0, 0, 0};
  98.         LONG delay;
  99.         #define dev (STRPTR)args[OPT_DEVICE]
  100.         #define cmd (STRPTR)args[OPT_CMD]
  101.         args[OPT_CMD] = (LONG)defcmd;
  102.         
  103.         /* Store away original contents */
  104.         oldwinp = myproc->pr_WindowPtr;
  105.         
  106.         /* We don't want any requesters */
  107.         myproc->pr_WindowPtr = (APTR)-1L;
  108.         
  109.         /* Get options */
  110.         if (rdargs = ReadArgs(TEMPLATE, (LONG *)&args, NULL))
  111.         {
  112.             BPTR lock;
  113.             
  114.             if( args[OPT_WAIT] )
  115.                 delay = (*((LONG *)args[OPT_WAIT])) * 50;
  116.             else
  117.                 delay = 50;
  118.             
  119.             /* Test for dev... Has it spun up? */
  120.             if( lock = Lock(dev, ACCESS_READ) )
  121.             {
  122.                 if( !args[OPT_NOREASSIGN] )
  123.                 {
  124.                     BPTR dupsys;
  125.                     BOOL ok;
  126.                 
  127.                     /* The device has spun up correctly, reassign assigns */
  128.                     Forbid();
  129.                     ok = FALSE;
  130.                     if( AssignLock("SYS", NULL) )
  131.                     {
  132.                         dupsys = DupLock(lock);
  133.                         if( AssignLock("SYS", dupsys) )
  134.                             ok = TRUE;
  135.                     }
  136.                     Permit();
  137.                 
  138.                     if( ok )
  139.                     {
  140.                         BPTR olddir;
  141.                         BPTR con;
  142.                     
  143.                         NewAssign("C", "SYS:C", lock);
  144.                         NewAssign("S", "SYS:S", lock);
  145.                         NewAssign("LIBS", "SYS:LIBS", lock);
  146.                         NewAssign("DEVS", "SYS:DEVS", lock);
  147.                         NewAssign("FONTS", "SYS:FONTS", lock);
  148.                         NewAssign("L", "SYS:L", lock);
  149.                         NewAssignLate("ENVARC", "SYS:Prefs/Env-Archive", lock);
  150.                     
  151.                         /* Change cd to SYS: */
  152.                         olddir = CurrentDir(lock);
  153.                     
  154.                         /* Open NIL: */
  155.                         if( con = Open("NIL:", MODE_OLDFILE) )
  156.                         {
  157.                             /* Execute startup-sequence */
  158.                             if( SystemTags(cmd, SYS_Input,  con,
  159.                                                 SYS_Output, 0,
  160.                                                 SYS_Asynch, TRUE,
  161.                                                 TAG_END ) == -1 )
  162.                                 Close(con);
  163.                         }                    
  164.                         /* Change back to old dir */
  165.                         CurrentDir(olddir);
  166.                     }
  167.                 }
  168.                 UnLock(lock);
  169.             } else
  170.             {
  171.                 /* Drive has not spun-up, lets wait a while */
  172.                 if( delay > 0 )
  173.                     Delay(delay);
  174.                 
  175.                 /* And then reboot */
  176.                 Disable();
  177.                 ColdReboot();
  178.                 Enable();
  179.                 /* .
  180.                  * .
  181.                  * .
  182.                  * This NEVER returns...
  183.                  *
  184.                  */
  185.             }
  186.             FreeArgs(rdargs);    
  187.         }
  188.         /* Restore old pointer */
  189.         myproc->pr_WindowPtr = oldwinp;
  190.     }
  191. }
  192.